信号量其实就是将异步执行变成了同步执行
信号量和锁其实差不多,锁每一次允许一个进程对数据进行修改,而信号量每次允许 num 个进程对数据进行修改
信号量了解就可以了
from multiprocessing import Semaphore
sem = Semaphore(4) # 每次允许4个进程同时进来
sem.acquire() # 上锁
print(0)
sem.acquire() # 上锁
print(1)
sem.acquire() # 上锁
print(2)
sem.acquire() # 上锁
print(3)
# sem.release() # 解锁,如果一个都没有解锁后面的进程是无法进来的
sem.acquire() # 上锁
print(4)
1. 迷你唱吧例子
- 假设商场里有4个迷你唱吧,所以同时可以进去4个人,如果来了第五个人就要在外面等待,等到有人出来才能再进去玩。
import time
import random
from multiprocessing import Semaphore
from multiprocessing import Process
def sing(i, sem):
sem.acquire() # 上锁,如果已经进入了4个进程,其他进程就无法进入
print('%s : 进来KTV' % i)
time.sleep(random.randint(1, 10)) # 随机延时1-10秒之间
print('%s : 离开KTV' % i)
sem.release() # 解锁,允许下一个等待的进程进入
if __name__ == '__main__':
sem = Semaphore(4) # 每次允许4个进程进入
for i in range(20):
p = Process(target=sing, args=(i, sem))
p.start()
← 进程同步 - Lock互斥锁 进程概念 →